import csv
import chardet
import pandas as pd
from collections import Counter
import difflib

'''
用于比较两个csv的列名称是否相同


'''
def get_csv_headers(file_path):
    """获取CSV文件的列标题（自动检测编码）"""
    # 检测文件编码
    with open(file_path, 'rb') as f:
        raw_data = f.read(10000)
        encoding = chardet.detect(raw_data)['encoding'] or 'gbk'

    # 读取第一行作为标题
    with open(file_path, 'r', encoding=encoding, errors='replace') as f:
        reader = csv.reader(f)
        try:
            headers = next(reader)
            return [header.strip() for header in headers]  # 去除前后空格
        except StopIteration:
            return []  # 空文件返回空列表
        except Exception as e:
            print(f"读取文件 {file_path} 时出错: {str(e)}")
            return []


def compare_headers(file1, file2):
    """比较两个CSV文件的列标题"""
    # 获取标题
    headers1 = get_csv_headers(file1)
    headers2 = get_csv_headers(file2)

    # 检查是否成功读取
    if not headers1:
        print(f"警告: {file1} 未找到列标题")
        return False
    if not headers2:
        print(f"警告: {file2} 未找到列标题")
        return False

    # 1. 完全相等（顺序和内容都相同）
    if headers1 == headers2:
        print("✅ 列标题完全相同（顺序和内容）")
        return True

    # 2. 内容相同但顺序不同
    if Counter(headers1) == Counter(headers2):
        print("⚠️ 列标题内容相同，但顺序不同")

        # 显示顺序差异
        print("\n顺序差异分析:")
        for i, (h1, h2) in enumerate(zip(headers1, headers2)):
            if h1 != h2:
                print(f"  位置 {i + 1}: {file1} 是 '{h1}' | {file2} 是 '{h2}'")

        return True  # 内容相同

    # 3. 内容不同
    print("❌ 列标题内容不同")

    # 找出差异
    unique_in_1 = set(headers1) - set(headers2)
    unique_in_2 = set(headers2) - set(headers1)

    # 显示差异
    if unique_in_1:
        print(f"\n只在 {file1} 中的列:")
        for col in unique_in_1:
            print(f"  - {col}")

    if unique_in_2:
        print(f"\n只在 {file2} 中的列:")
        for col in unique_in_2:
            print(f"  - {col}")

    # 4. 相似性分析（找出可能的重命名）
    similar_pairs = []
    for h1 in headers1:
        if h1 not in headers2:
            # 在另一个文件中找到最相似的标题
            matches = difflib.get_close_matches(h1, headers2, n=1, cutoff=0.7)
            if matches:
                similar_pairs.append((h1, matches[0]))

    if similar_pairs:
        print("\n可能的重命名列:")
        for pair in similar_pairs:
            print(f"  {pair[0]} (在 {file1}) → {pair[1]} (在 {file2})")

    return False


def detailed_comparison_report(file1, file2):
    """生成详细的比较报告"""
    headers1 = get_csv_headers(file1)
    headers2 = get_csv_headers(file2)

    # 创建比较表格
    max_len = max(len(headers1), len(headers2))
    comparison = []

    for i in range(max_len):
        col1 = headers1[i] if i < len(headers1) else "N/A"
        col2 = headers2[i] if i < len(headers2) else "N/A"

        status = "✅" if col1 == col2 else "❌"
        comparison.append([i + 1, col1, col2, status])

    # 创建DataFrame并保存
    df = pd.DataFrame(comparison, columns=["位置", f"{file1}列名", f"{file2}列名", "状态"])

    # 添加摘要信息
    summary = {
        "文件1": file1,
        "文件2": file2,
        "文件1列数": len(headers1),
        "文件2列数": len(headers2),
        "完全匹配": len(headers1) == len(headers2) and headers1 == headers2,
        "内容匹配": Counter(headers1) == Counter(headers2),
        "差异列数": len(set(headers1).symmetric_difference(set(headers2)))
    }

    # 保存到Excel（更直观）
    output_file = "column_comparison_report.xlsx"
    with pd.ExcelWriter(output_file) as writer:
        df.to_excel(writer, sheet_name="详细比较", index=False)

        # 添加摘要工作表
        summary_df = pd.DataFrame([summary])
        summary_df.to_excel(writer, sheet_name="摘要", index=False)

    print(f"\n详细比较报告已保存到: {output_file}")
    print("在Excel中打开可查看完整比较结果")


# 使用示例

file1 = r"D:\AAAAA\23-24.csv"
file2 = r"D:\AAAAA\22-23.csv"

print(f"比较文件:\n  1. {file1}\n  2. {file2}\n")

    # 基本比较
are_identical = compare_headers(file1, file2)

    # 生成详细报告
if not are_identical:
    detailed_comparison_report(file1, file2)